home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -screenplay- / shareware / wreckage / source / assembly / asm_3d_s2c.asm < prev    next >
Assembly Source File  |  1999-02-08  |  3KB  |  210 lines

  1. ;    a0     &ox
  2. ;    a1    &oy
  3. ;    a2    &oz
  4. ;    a3    &oapp
  5. ;    a4    &sincache
  6. ;    d0    templong
  7. ;    sincache(0)=cvaz*32767;0
  8. ;    sincache(1)=svaz*32767;2
  9. ;    sincache(2)=cvax*32767;4
  10. ;    sincache(3)=svax*32767;6
  11. ;    sincache(4)=cvay*32767;8
  12. ;    sincache(5)=svay*32767;10
  13.  
  14.         ;A5-A7 MUST NOT BE TRASHED!!!
  15.     MOVE.w    (a4),d0
  16.     MOVEM.l    a4-a6,-(a7)    ;PUSH a5
  17.     MOVE.l    d0,-(a7)
  18.     MOVE.l    d2,a4
  19.     MOVE.l    d1,a6    ;load new value
  20.  
  21. _rot_loop1:
  22.  
  23.     MOVE.b     (a3)+,d1    ;oapp
  24.       BEQ     _hide_point2    ;(oapp=0)=> skip point
  25.  
  26.  
  27. ;Main Code :)
  28. ;--------
  29.  
  30.     MOVE.w    (a4),d6    ;get cos
  31.     MOVE.w    2(a4),d7    ;get sin
  32.  
  33.       MOVE.l     (a0)+,d1    ;d1=ox(n)
  34.      CLR.w     d1
  35.       SWAP     d1
  36.  
  37.       MOVE.w     d1,d2    ;d2=x
  38.       MULS.w     d6,d1    ;x*csa
  39.     add.l    d1,d1
  40.       MULS.w     d7,d2    ;x*sna
  41.     add.l    d2,d2
  42.  
  43.       MOVE.l     (a1)+,d3    ;oy(n)
  44.       CLR.w     d3
  45.       SWAP     d3
  46.  
  47.       MOVE.w     d3,d4    ;y
  48.  
  49.       MULS.w     d7,d3    ;y*sna
  50.     add.l     d3,d3
  51.       SUB.l     d3,d1    ;x*csa-y*sna
  52.  
  53.       MULS.w     d6,d4    ;y*csa
  54.     add.l    d4,d4
  55.       ADD.l     d2,d4    ;y*csa+x*sna
  56.  
  57.  
  58.  
  59.     ;d4 holds Y
  60.     ;d1 holds X
  61.  
  62.  
  63. _rot_loop2:
  64. ;      yy=y*cvax-z*svax    
  65. ;      zz=z*cvax+y*svax
  66.  
  67.     MOVE.w    4(a4),d6    ;get cos
  68.     MOVE.w    6(a4),d7    ;get sin
  69.  
  70.       MOVE.l     (a2)+,d5    ;d2=oz(n)
  71.      CLR.w     d5
  72.       SWAP     d5
  73.  
  74.       MOVE.w     d5,d2    ;d2=z
  75.  
  76.       MULS.w     d6,d5    ;z*csa
  77.     add.l    d5,d5
  78.       MULS.w     d7,d2    ;z*sna
  79.     add.l    d2,d2
  80.  
  81.     CLR.w    d4
  82.     SWAP    d4
  83.       MOVE.w     d4,d3    ;y is still here
  84.                 ;   <grin>
  85.  
  86.       MULS.w     d6,d3    ;y*csa
  87.     add.l    d3,d3
  88.       SUB.l     d2,d3    ;yy=y*csa-z*sna
  89.  
  90.       MULS.w     d7,d4    ;y*sna
  91.     add.l    d4,d4
  92.       ADD.l     d5,d4    ;zz=z*csa+y*sna
  93.  
  94. ;    X    D1
  95. ;    Z    D4
  96. ;    Y    D3 (do not trash)
  97. ;        -----------------
  98.  
  99. _rot_loop3:
  100. ;      xx=x*cvay-z*svay
  101. ;      zz=z*cvay+x*svay
  102.  
  103.     MOVE.w    8(a4),d6    ;get cos
  104.     MOVE.w    10(a4),d7    ;get sin
  105.  
  106.     CLR.W    d4
  107.     SWAP    d4
  108.       MOVE.w     d4,d2    ;d2=z (yes, it is still here)
  109.  
  110.       MULS.w     d6,d4    ;z*csa
  111.     add.l    d4,d4
  112.       MULS.w     d7,d2    ;z*sna
  113.     add.l    d2,d2
  114.  
  115.     CLR.w    d1
  116.     SWAP    d1
  117.  
  118.       MOVE.w     d1,d5    ;x is still here (I hope)
  119.       MULS.w     d6,d1    ;x*csa
  120.     add.l    d1,d1
  121.       SUB.l     d2,d1    ;xx=x*csa-z*sna
  122.  
  123.       MULS.w     d7,d5    ;x*sna
  124.     add.l    d5,d5
  125.       ADD.l     d4,d5    ;zz=z*csa+x*sna
  126.  
  127. ;    X    D1
  128. ;    Y    D3
  129. ;    Z    D5
  130.  
  131.  
  132. ;    And do the 2d->3d Projection
  133.  
  134.     MOVE.w    d3,d4
  135.     CLR.w    d3    ;d3 IS a longword..
  136.     SWAP    d3    ;but I am shifting it twice..
  137.     EXT.l    d3    ;yeah
  138.     ASR.l    #1,d3
  139. ;    ADDI.l    #6,d3
  140.     TST.l     d3
  141.     BLE     _hide_point
  142.     
  143.     MOVE.w    12(a4),d2
  144. ;    MOVE.w    d1,d6
  145.     DIVS.l    d3,d1    ;this is x
  146. ;    MOVE.w   d5,d7
  147.     DIVS.l    d3,d5    
  148.  
  149. ;    SWAP     d1
  150. ;    SWAP    d5
  151. ;    CLR.w    d1
  152. ;    CLR.w    d5
  153.  
  154. ;    TST.w    d4
  155. ;    BEQ    _no_accuracy
  156. ;    DIVU.l    d4,d6
  157. ;    DIVU.l    d4,d7
  158. ;    ADD.w    d6,d1
  159. ;    ADD.w    d7,d5
  160. _no_accuracy:
  161.     ASR.l    d2,d1
  162.     ASR.l    d2,d5
  163.     CMP.w    #320,d1
  164.     BLT    _clipa
  165.     MOVE.w     #320,d1
  166.     BRA    _clipd
  167. _clipa:
  168.     CMP.w    #-320,d1
  169.     BGT    _clipb
  170.     MOVE.w    #-320,d1
  171. _clipb:
  172.     CMP.w    #320,d5
  173.     BLT    _clipc
  174.     MOVE.w    #320,d5
  175.     BRA    _clipd
  176. _clipc:
  177.     CMP.w    #-320,d5
  178.     BGT    _clipd
  179.     MOVE.w    #-320,d5
  180. _clipd:
  181.  
  182.     ADD.w    14(a4),d1
  183.     ADD.w    16(a4),d5
  184.  
  185.     MOVE.w    #1    ,d7    ;display point!!
  186.     BRA    _loop_ending
  187.     
  188.         
  189. _hide_point2:
  190.     ADDQ.l    #4    ,a0
  191.     ADDQ.l    #4    ,a1
  192.     ADDQ.l    #4    ,a2
  193.  
  194. _hide_point:
  195.     CLR.w d7
  196.  
  197.  
  198. _loop_ending:
  199.     
  200.     
  201.     MOVE.w     d1    ,(a6)+    ;sx
  202.      MOVE.w     d5    ,(a6)+        ;sy
  203.       MOVE.w     d7    ,(a6)+        ;app
  204.  
  205.       SUBQ.l    #1    ,d0    ;n=n-1
  206.       BGT     _rot_loop1
  207.  
  208.     MOVE.l    (a7)+    ,d0
  209.     MOVEM.l    (a7)+    ,a4-a6    ;POP A5
  210.